home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / lua / 50 / compat-5.1.lua
Text File  |  2007-10-24  |  6KB  |  268 lines

  1. --
  2. -- Compat-5.1
  3. -- Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat)
  4. -- According to Lua 5.1
  5. -- $Id: compat-5.1.lua,v 1.22 2006/02/20 21:12:47 carregal Exp $
  6. --
  7.  
  8. _COMPAT51 = "Compat-5.1 R5"
  9.  
  10. local LUA_DIRSEP = '/'
  11. local LUA_OFSEP = '_'
  12. local OLD_LUA_OFSEP = ''
  13. local POF = 'luaopen_'
  14. local LUA_PATH_MARK = '?'
  15. local LUA_IGMARK = ':'
  16.  
  17. local assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type = assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type
  18. local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub
  19.  
  20. --
  21. -- avoid overwriting the package table if it's already there
  22. --
  23. package = package or {}
  24. local _PACKAGE = package
  25.  
  26. package.path = LUA_PATH or os.getenv("LUA_PATH") or
  27.              ("./?.lua;" ..
  28.               "/usr/local/share/lua/5.0/?.lua;" ..
  29.               "/usr/local/share/lua/5.0/?/?.lua;" ..
  30.               "/usr/local/share/lua/5.0/?/init.lua" )
  31.  
  32. package.cpath = LUA_CPATH or os.getenv("LUA_CPATH") or
  33.              "./?.so;" ..
  34.              "./l?.so;" ..
  35.              "/usr/local/lib/lua/5.0/?.so;" ..
  36.              "/usr/local/lib/lua/5.0/l?.so"
  37.  
  38. --
  39. -- make sure require works with standard libraries
  40. --
  41. package.loaded = package.loaded or {}
  42. package.loaded.debug = debug
  43. package.loaded.string = string
  44. package.loaded.math = math
  45. package.loaded.io = io
  46. package.loaded.os = os
  47. package.loaded.table = table 
  48. package.loaded.base = _G
  49. package.loaded.coroutine = coroutine
  50. local _LOADED = package.loaded
  51.  
  52. --
  53. -- avoid overwriting the package.preload table if it's already there
  54. --
  55. package.preload = package.preload or {}
  56. local _PRELOAD = package.preload
  57.  
  58.  
  59. --
  60. -- looks for a file `name' in given path
  61. --
  62. local function findfile (name, pname)
  63.     name = gsub (name, "%.", LUA_DIRSEP)
  64.     local path = _PACKAGE[pname]
  65.     assert (type(path) == "string", format ("package.%s must be a string", pname))
  66.     for c in gfind (path, "[^;]+") do
  67.         c = gsub (c, "%"..LUA_PATH_MARK, name)
  68.         local f = io.open (c)
  69.         if f then
  70.             f:close ()
  71.             return c
  72.         end
  73.     end
  74.     return nil -- not found
  75. end
  76.  
  77.  
  78. --
  79. -- check whether library is already loaded
  80. --
  81. local function loader_preload (name)
  82.     assert (type(name) == "string", format (
  83.         "bad argument #1 to `require' (string expected, got %s)", type(name)))
  84.     assert (type(_PRELOAD) == "table", "`package.preload' must be a table")
  85.     return _PRELOAD[name]
  86. end
  87.  
  88.  
  89. --
  90. -- Lua library loader
  91. --
  92. local function loader_Lua (name)
  93.     assert (type(name) == "string", format (
  94.         "bad argument #1 to `require' (string expected, got %s)", type(name)))
  95.     local filename = findfile (name, "path")
  96.     if not filename then
  97.         return false
  98.     end
  99.     local f, err = loadfile (filename)
  100.     if not f then
  101.         error (format ("error loading module `%s' (%s)", name, err))
  102.     end
  103.     return f
  104. end
  105.  
  106.  
  107. local function mkfuncname (name)
  108.     name = gsub (name, "^.*%"..LUA_IGMARK, "")
  109.     name = gsub (name, "%.", LUA_OFSEP)
  110.     return POF..name
  111. end
  112.  
  113. local function old_mkfuncname (name)
  114.     --name = gsub (name, "^.*%"..LUA_IGMARK, "")
  115.     name = gsub (name, "%.", OLD_LUA_OFSEP)
  116.     return POF..name
  117. end
  118.  
  119. --
  120. -- C library loader
  121. --
  122. local function loader_C (name)
  123.     assert (type(name) == "string", format (
  124.         "bad argument #1 to `require' (string expected, got %s)", type(name)))
  125.     local filename = findfile (name, "cpath")
  126.     if not filename then
  127.         return false
  128.     end
  129.     local funcname = mkfuncname (name)
  130.     local f, err = loadlib (filename, funcname)
  131.     if not f then
  132.         funcname = old_mkfuncname (name)
  133.         f, err = loadlib (filename, funcname)
  134.         if not f then
  135.             error (format ("error loading module `%s' (%s)", name, err))
  136.         end
  137.     end
  138.     return f
  139. end
  140.  
  141.  
  142. local function loader_Croot (name)
  143.     local p = gsub (name, "^([^.]*).-$", "%1")
  144.     if p == "" then
  145.         return
  146.     end
  147.     local filename = findfile (p, "cpath")
  148.     if not filename then
  149.         return
  150.     end
  151.     local funcname = mkfuncname (name)
  152.     local f, err, where = loadlib (filename, funcname)
  153.     if f then
  154.         return f
  155.     elseif where ~= "init" then
  156.         error (format ("error loading module `%s' (%s)", name, err))
  157.     end
  158. end
  159.  
  160. -- create `loaders' table
  161. package.loaders = package.loaders or { loader_preload, loader_Lua, loader_C, loader_Croot, }
  162. local _LOADERS = package.loaders
  163.  
  164.  
  165. --
  166. -- iterate over available loaders
  167. --
  168. local function load (name, loaders)
  169.     -- iterate over available loaders
  170.     assert (type (loaders) == "table", "`package.loaders' must be a table")
  171.     for i, loader in ipairs (loaders) do
  172.         local f = loader (name)
  173.         if f then
  174.             return f
  175.         end
  176.     end
  177.     error (format ("module `%s' not found", name))
  178. end
  179.  
  180. -- sentinel
  181. local sentinel = function () end
  182.  
  183. --
  184. -- new require
  185. --
  186. function _G.require (modname)
  187.     assert (type(modname) == "string", format (
  188.         "bad argument #1 to `require' (string expected, got %s)", type(name)))
  189.     local p = _LOADED[modname]
  190.     if p then -- is it there?
  191.         if p == sentinel then
  192.             error (format ("loop or previous error loading module '%s'", modname))
  193.         end
  194.         return p -- package is already loaded
  195.     end
  196.     local init = load (modname, _LOADERS)
  197.     _LOADED[modname] = sentinel
  198.     local actual_arg = _G.arg
  199.     _G.arg = { modname }
  200.     local res = init (modname)
  201.     if res then
  202.         _LOADED[modname] = res
  203.     end
  204.     _G.arg = actual_arg
  205.     if _LOADED[modname] == sentinel then
  206.         _LOADED[modname] = true
  207.     end
  208.     return _LOADED[modname]
  209. end
  210.  
  211.  
  212. -- findtable
  213. local function findtable (t, f)
  214.     assert (type(f)=="string", "not a valid field name ("..tostring(f)..")")
  215.     local ff = f.."."
  216.     local ok, e, w = find (ff, '(.-)%.', 1)
  217.     while ok do
  218.         local nt = rawget (t, w)
  219.         if not nt then
  220.             nt = {}
  221.             t[w] = nt
  222.         elseif type(t) ~= "table" then
  223.             return sub (f, e+1)
  224.         end
  225.         t = nt
  226.         ok, e, w = find (ff, '(.-)%.', e+1)
  227.     end
  228.     return t
  229. end
  230.  
  231. --
  232. -- new package.seeall function
  233. --
  234. function _PACKAGE.seeall (module)
  235.     local t = type(module)
  236.     assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")")
  237.     local meta = getmetatable (module)
  238.     if not meta then
  239.         meta = {}
  240.         setmetatable (module, meta)
  241.     end
  242.     meta.__index = _G
  243. end
  244.  
  245.  
  246. --
  247. -- new module function
  248. --
  249. function _G.module (modname, ...)
  250.     local ns = _LOADED[modname]
  251.     if type(ns) ~= "table" then
  252.         ns = findtable (_G, modname)
  253.         if not ns then
  254.             error (string.format ("name conflict for module '%s'", modname))
  255.         end
  256.         _LOADED[modname] = ns
  257.     end
  258.     if not ns._NAME then
  259.         ns._NAME = modname
  260.         ns._M = ns
  261.         ns._PACKAGE = gsub (modname, "[^.]*$", "")
  262.     end
  263.     setfenv (2, ns)
  264.     for i, f in ipairs (arg) do
  265.         f (ns)
  266.     end
  267. end
  268.